import axios from 'axios'
import { Toast } from 'vant'

// 区分开发环境(development)下的测试接口与生产环境(production)下的真实(线上)接口基准路径
const baseURL = process.env.NODE_ENV === 'development'
  ? 'http://quanzhan.site:3000'
  : 'http://www.xiongmaoyouxuan.com'

// 创建 axios 实例
const service = axios.create({
  baseURL, // 基准路径
  timeout: 10000 // 超时时间
})

// 请求拦截
service.interceptors.request.use(config => {
  /* 在发送请求之前做些什么 */
  // 在发送请求前，进行加载提示
  Toast.loading({
    message: '加载中...',
    duration: 0
  })
  // 在请求头中添加 token 的传递
  // TODO......

  // 返回配置对象
  return config
}, err => {
  Toast.clear()
  return Promise.reject(err)
})

// 响应拦截
service.interceptors.response.use(response => {
  /* 对响应数据做点什么 */
  // 响应返回，则关闭加载提示
  Toast.clear()
  // 处理服务端返回的响应数据
  if (response.status >= 200 && response.status < 300) {
    // 通过 response.data 获取到服务端返回的响应数据
    // 当前项目访问的后端与前端接口规范为: 返回对象，有 {code, data, msg} 属性，当 code 为 200 时，
    // data 中保存的是正确获取到的数据，如果 code 不为 200，则说明有错误，在 msg 中提示的错误信息
    const { code, data, msg } = response.data
    if (code === 200) {
      // 成功，则返回需要获取使用的数据
      return data
    }

    // 如果失败，则将 Promise 标记为 rejected 失败状态
    const error = new Error(msg)
    return Promise.reject(error)
  }

  // 如果响应状态码不为 2xx，则说明有异常
  const err = new Error('接口访问异常')
  return Promise.reject(err)
}, err => {
  /* 对响应错误做点什么，比如网络问题导致错误，会在这儿处理 */
  Toast.clear()
  return Promise.reject(err)
})

// 导出模块
export default service
